package studia.figlewicz.math.library;

import java.util.Date;
import java.util.LinkedHashSet;
import java.util.Set;

public class _test_przeplyw_walutowy_model_FX_Rate {
	

	
	public static void main(String[] args) {
		
		
		Date wygasniecie = new Date(103,0,1);
		Double nominal = new Double(1000);
		
		PrzeplywPieniezny platnoscFX = new PrzeplywWalutowy(wygasniecie,nominal);
		
		
/////////////////////////////////////////////////////
		// projekcje
/////////////////////////////////////////////////////
		// zarzadca projekcji
		Date poczatekSymulacji = new Date(101,0,1);
		Set<Date> datySymulacji = new LinkedHashSet<Date>();
		datySymulacji.add(new Date(103,0,1));
		
		ZarzadcaProjekcji zarzadcaProjekcji = new ZarzadcaProjekcji();
		
		// modele
		Model FXModel = new ModelFXRate(MetodaInterpolacji.LINIOWA);
		zarzadcaProjekcji.dodajModel(FXModel);
		
		Konwencja konwencjaShortRate = Utils.getStandardKonwencja();
		Konwencja konwencjaIRS = Utils.getStandardKonwencja();
		
		Date dataNotowania = new Date(101,0,1);
		KontraktNaStopeProcentowa short1DPLN = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(1,0,0,0),dataNotowania,99.99,konwencjaShortRate);
		KontraktNaStopeProcentowa short2DPLN = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(2,0,0,0),dataNotowania,99.98,konwencjaShortRate);
		KontraktNaStopeProcentowa short1WPLN = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(0,1,0,0),dataNotowania,99.90,konwencjaShortRate);
		KontraktNaStopeProcentowa short1MPLN = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(0,0,1,0),dataNotowania,99.55,konwencjaShortRate);
		KontraktNaStopeProcentowa short3MPLN = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(0,0,3,0),dataNotowania,98.15,konwencjaShortRate);
		KontraktNaStopeProcentowa short6MPLN = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(0,0,6,0),dataNotowania,97,konwencjaShortRate);
		KontraktNaStopeProcentowa IRS1YPLN = new NotowanieIRS(new Termin(0,0,0,0), new Termin(0,0,0,1),dataNotowania,6.15,konwencjaIRS);
		KontraktNaStopeProcentowa IRS2YPLN = new NotowanieIRS(new Termin(0,0,0,0), new Termin(0,0,0,2),dataNotowania,6.20,konwencjaIRS);
		KrzywaStopyProcentowej krzywaKrajowa = new KrzywaStopyProcentowej();
		krzywaKrajowa.dodajKontrakt(short1DPLN);
		krzywaKrajowa.dodajKontrakt(short2DPLN);
		krzywaKrajowa.dodajKontrakt(short1WPLN);
		krzywaKrajowa.dodajKontrakt(short1MPLN);
		krzywaKrajowa.dodajKontrakt(short3MPLN);
		krzywaKrajowa.dodajKontrakt(short6MPLN);
		krzywaKrajowa.dodajKontrakt(IRS1YPLN);
		krzywaKrajowa.dodajKontrakt(IRS2YPLN);
		
		KontraktNaStopeProcentowa short1DEUR = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(1,0,0,0),dataNotowania,99.997,konwencjaShortRate);
		KontraktNaStopeProcentowa short2DEUR = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(2,0,0,0),dataNotowania,99.992,konwencjaShortRate);
		KontraktNaStopeProcentowa short1WEUR = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(0,1,0,0),dataNotowania,99.97,konwencjaShortRate);
		KontraktNaStopeProcentowa short1MEUR = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(0,0,1,0),dataNotowania,99.85,konwencjaShortRate);
		KontraktNaStopeProcentowa short3MEUR = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(0,0,3,0),dataNotowania,99.35,konwencjaShortRate);
		KontraktNaStopeProcentowa short6MEUR = new NotowanieShortRate(new Termin(0,0,0,0), new Termin(0,0,6,0),dataNotowania,99,konwencjaShortRate);
		KontraktNaStopeProcentowa IRS1YEUR = new NotowanieIRS(new Termin(0,0,0,0), new Termin(0,0,0,1),dataNotowania,2.05,konwencjaIRS);
		KontraktNaStopeProcentowa IRS2YEUR = new NotowanieIRS(new Termin(0,0,0,0), new Termin(0,0,0,2),dataNotowania,2.10,konwencjaIRS);
		KrzywaStopyProcentowej krzywaObca = new KrzywaStopyProcentowej();
		krzywaObca.dodajKontrakt(short1DEUR);
		krzywaObca.dodajKontrakt(short2DEUR);
		krzywaObca.dodajKontrakt(short1WEUR);
		krzywaObca.dodajKontrakt(short1MEUR);
		krzywaObca.dodajKontrakt(short3MEUR);
		krzywaObca.dodajKontrakt(short6MEUR);
		krzywaObca.dodajKontrakt(IRS1YEUR);
		krzywaObca.dodajKontrakt(IRS2YEUR);
		
		
		ZmiennaObjasniajaca krzywaTerminowaKrajowa = krzywaKrajowa;
		ZmiennaObjasniajaca krzywaTerminowaObca = krzywaObca;
		IndexSpot FXSpot = new IndexSpot();
		Konwencja konwencjaSpot = Utils.getStandardKonwencja();
		FXSpot.addNotowanie(new NotowanieSpot(dataNotowania,3.95,konwencjaSpot));
		ZmiennaObjasniajaca kursSpot = FXSpot;
		FXModel.setZmiennaObjasniajaca(ModelFXRate.ZMIENNA_OBJASNIAJACA_STOPA_PROCENTOWA,krzywaTerminowaKrajowa);
		FXModel.setZmiennaObjasniajaca(ModelFXRate.ZMIENNA_OBJASNIAJACA_STOPA_PROCENTOWA_OBCA,krzywaTerminowaObca);
		FXModel.setZmiennaObjasniajaca(ModelFXRate.ZMIENNA_OBJASNIAJACA_FX_SPOT,kursSpot);
		
		// wykonanie projekcji
		zarzadcaProjekcji.wykonajProjekcjeMonteCarlo(datySymulacji, poczatekSymulacji, 1);
		
/////////////////////////////////////////////////////
		// wycena
/////////////////////////////////////////////////////
		
		
		// zarzadca wyceny
		ZarzadcaWyceny zarzadcaWyceny = new ZarzadcaWyceny();
		zarzadcaWyceny.dodajPrzeplyw(platnoscFX);

		ZmiennaRynkowa kursWymiany = new ZmiennaRynkowa(FXModel,ModelFXRate.ZMIENNA_OBJASNIANA_EXCHANGE_RATE);
		
		platnoscFX.setZmienneRynkowe(PrzeplywWalutowy.CENA_INSTRUMENTU_PODSTAWOWEGO, kursWymiany);

		zarzadcaWyceny.setDyskonto(krzywaKrajowa,poczatekSymulacji);
		
		zarzadcaWyceny.wycenaMonteCarlo(platnoscFX,zarzadcaProjekcji.getMagazynWynikow(),1);

		WynikWyceny cena = platnoscFX.getWynikWyceny();

		
	}

	
}
